//基于axios封装网络请求
import theAxios from "axios";
import $ from "jquery";
import { MyNotify } from "@/utils/Notify";
import router from "@/router";
import { getToken, removeToken, setToken } from "./token.js";
import { refreshTokenAPI } from "@/api";
import { removeStorage } from "@/utils/storage";

const axios = theAxios.create({
  baseURL: "http://geek.itheima.net", //基地址,URL必须大写
  timeout: 20000, //等待超过20s就判定为网络超时
});

// 添加请求拦截器
axios.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    // console.log("111");
    //统一携带token,r如果已经携带了refresh_token就不需要再统一携带token
    if (getToken()?.length > 0 && config.headers.Authorization === undefined) {
      config.headers.Authorization = `Bearer ${getToken()}`;
    }
    return config;
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 添加响应拦截器
axios.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么
    return response;
  },
  async function (error) {
    // 对响应错误做点什么
    // console.dir(error.response.status);
    //判断是否登录过期，401为token过期
    if (error.response && error.response.status === 401) {
      removeToken(); //清除token才能让路由守卫判断为失效，进而放我去登录页
      //方式1，直接跳转有感知
      // router.replace({ path: "/login" });

      //方式2.使用refresh_token换回新的token,用户无感知
      const res = await refreshTokenAPI();
      //1.本地更新新的token
      setToken(res.data.data.token);
      //2.携带上新的token
      error.config.headers.Authorization = `Bearer ${res.data.data.token}`;
      // console.log(res);
      //重新调用刚刚的请求，return回去一个Promise对象
      return axios(error.config);
    } else if (
      error.response.status === 500 &&
      error.config.url === "/v1_0/authorizations" &&
      error.config.method === "put"
    ) {
      //如果refresh_token也过期，这个时候就需要重新登录
      MyNotify({ type: "warning", message: "身份已过期" });
      //将未遂地址保存到地址栏带给登陆界面，方便登陆后再回到该地址
      router.replace(`/login?path=${router.currentRoute.fullPath}`);
      removeToken(res.data.data.token);
      removeStorage("refresh_token");
    }
    return Promise.reject(error);
  }
);

//直接导出太过于局限,返回一个匿名函数
export default ({
  url,
  method = "GET",
  params = {},
  data = {},
  headers = {},
}) => {
  //基于axios
  return axios({
    url,
    method,
    params,
    data,
    headers,
  });
  //基于jquery的$.ajax
  //   return new Promise((resolve, reject) => {
  //     //如果params有值,需要将params拼接到url后面
  //     $.ajax({
  //       url,
  //       data,
  //       headers,
  //       type: method,
  //       //成功拿到数据
  //       success: (res) => {
  //         resolve(res);
  //       },
  //       //获取数据失败
  //       error: (err) => {
  //         reject(err);
  //       },
  //     });
  //   });
};
